package com.study.d012Components.tableview;

import java.util.Comparator;
import java.util.function.Consumer;

import javafx.application.Application;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.SortEvent;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TableView.ResizeFeatures;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableColumn.SortType;
import javafx.scene.control.TablePosition;
import javafx.scene.layout.AnchorPane;
import javafx.stage.Stage;
import javafx.util.Callback;
import javafx.util.StringConverter;

/** 简单数据类型 -- 基本table展示， 列设置使用Callback()回调方法
*@description
*@author xtayhame
*date 2020年3月14日
*version
*since v1.0
*/
public class TableViewMain1 extends Application{
	public static void main(String[] args) {
		launch(args);

	}
	@Override
	public void start(Stage stage) throws Exception {
		AnchorPane an = new AnchorPane();

		Button b1 =new Button("测试");

		TableView<Data> tableView = new TableView<Data>();


		an.getChildren().addAll(b1, tableView);
		AnchorPane.setTopAnchor(b1, 10.0);
		AnchorPane.setLeftAnchor(b1, 20.0);
		AnchorPane.setTopAnchor(tableView, 40.0);
		AnchorPane.setLeftAnchor(tableView, 20.0);


		stage.setScene(new Scene(an, 400, 500));
		stage.show();


		ObservableList<Data> datas=FXCollections.observableArrayList();
		Data d1 = new Data("张三", 19, 55.9, true);
		Data d2 = new Data("李四", 20, 75.9, true);
		Data d3 = new Data("王五", 21, 85.9, false);
		Data d4 = new Data("赵柳A", 15, 95.9, true);
		Data d5 = new Data("赵柳B", 25, 95.9, true);
		Data d6 = new Data("赵柳C", 35, 95.9, true);
		Data d7 = new Data("赵柳D", 45, 95.9, true);
		Data d8 = new Data("赵柳E", 55, 95.9, true);
		Data d9 = new Data("赵柳F", 65, 95.9, true);
		Data d10 = new Data("赵柳G", 75, 95.9, true);
		Data d11 = new Data("赵柳H", 85, 95.9, true);
		Data d12 = new Data("赵柳I", 95, 95.9, true);
		Data d13 = new Data("赵柳G", 105, 95.9, true);
		Data d14 = new Data("赵柳K", 115, 95.9, true);

		datas.addAll(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14);

		tableView.setItems(datas);

		TableColumn<Data, String> tc_name=new TableColumn<Data, String>("姓名");
		tc_name.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data,String>, ObservableValue<String>>() {
			@Override
			public ObservableValue<String> call(CellDataFeatures<Data, String> param) {
				SimpleStringProperty sp = new SimpleStringProperty(param.getValue().getName());
				return sp;
			}
		});

		TableColumn<Data, Number> tc_age=new TableColumn<Data, Number>("年龄");
		tc_age.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data,Number>, ObservableValue<Number>>(
				) {
					@Override
					public ObservableValue<Number> call(CellDataFeatures<Data, Number> param) {
						SimpleIntegerProperty sp = new SimpleIntegerProperty(param.getValue().getAge());
						return sp;
					}
		});

		//注意，这里要使用Number类型，因为只有ObservableValue<Number>这个泛型类
		TableColumn<Data, Number> tc_score=new TableColumn<Data, Number>("分数");
		tc_score.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data,Number>, ObservableValue<Number>>() {
			@Override
			public ObservableValue<Number> call(CellDataFeatures<Data, Number> param) {
				SimpleDoubleProperty sp = new SimpleDoubleProperty(param.getValue().getScore());
				return sp;
			}
		});

		TableColumn<Data, Boolean> tc_is=new TableColumn<Data, Boolean>("是否选中");
		tc_is.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Data,Boolean>, ObservableValue<Boolean>>() {

			@Override
			public ObservableValue<Boolean> call(CellDataFeatures<Data, Boolean> param) {
				SimpleBooleanProperty sp =new SimpleBooleanProperty(param.getValue().isIs());
				return sp;
			}
		});

		tableView.getColumns().add(tc_name);
		tableView.getColumns().add(tc_age);
		tableView.getColumns().add(tc_score);
		tableView.getColumns().add(tc_is);





		/**************tableview基本设置***********************/
		//设置列菜单显示
		tableView.setTableMenuButtonVisible(true);

		//设置宽和高
		tableView.setPrefSize(300, 400);
		//设置每一行的高度
		tableView.setFixedCellSize(40);

		//平均设置没列的宽度
		/*double width2= (tableView.getPrefWidth() / tableView.getColumns().size() ) * 1.5;
		for (int i = 0; i < tableView.getColumns().size(); i++) {
			tableView.getColumns().get(i).setPrefWidth(width2);
		}*/

		//单独设置某一列的宽度
		//tc_name.setPrefWidth(40);

		//设置列宽
		//tableView.setColumnResizePolicy(tableView.CONSTRAINED_RESIZE_POLICY);   //会平均设置列的宽度，没有水平滚动条
		//tableView.setColumnResizePolicy(tableView.UNCONSTRAINED_RESIZE_POLICY);  //默认方式， 带水平滚动条
		//自定义
		tableView.setColumnResizePolicy(new Callback<TableView.ResizeFeatures, Boolean>() {

			@Override
			public Boolean call(ResizeFeatures param) {
				if(param !=null && param.getColumn() !=null){
					double wd= param.getColumn().getPrefWidth();
					//设置列的宽度为 原来的宽度+增量
					param.getColumn().setPrefWidth(wd + param.getDelta());
				}
				//返回 true,则不能进行拖拽设置列宽度
				return true;
			}
		});

		//设置某一列不可见
		//tc_is.setVisible(false);

		//当没有数据加载时的占位显示
		//tableView.setPlaceholder(new Label("没有查到数据"));

		//设置旋转
		//tableView.setRotate(0.9);

		//开启单元格可选，默认只能选择行
		tableView.getSelectionModel().setCellSelectionEnabled(true);

		//开启多选，如果开启了单元格可选，则可以选择多个连续的单元格
		tableView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

		//设置某一列可以排序
		tc_name.setSortable(true);
		//按照升序排列
		tc_name.setSortType(SortType.ASCENDING);
		//设置排序优先级
		tableView.getSortOrder().addAll(tc_name,tc_age,tc_score,tc_is);

		//设置排序
		tableView.setOnSort(new EventHandler<SortEvent<TableView<Data>>>() {
			@Override
			public void handle(SortEvent<TableView<Data>> event) {
				TableView<Data> td=event.getSource();
			}
		});

		//设置排序
		/*tableView.setSortPolicy(new Callback<TableView<Data>, Boolean>() {
			@Override
			public Boolean call(TableView<Data> param) {
				param.getColumns().forEach(new Consumer<TableColumn>() {
					@Override
					public void accept(TableColumn t) {
						if(t.getText().equals("姓名") && t.getSortType() ==SortType.ASCENDING){
							t.setSortNode(new Label("升"));
							param.getItems().sort(new Comparator<Data>() {
								@Override
								public int compare(Data o1, Data o2) {
									// TODO Auto-generated method stub
									return o2.getName().compareTo(o1.getName());
								}
							});
						}
					}
				});


				return true;
			}

		});
*/

		//监听选择的行
		tableView.getSelectionModel().getSelectedItems().addListener(new InvalidationListener() {
			@Override
			public void invalidated(Observable observable) {
				System.out.println("当前选择的行数据时：");
				//System.out.println("observable="+ observable);

				ObservableList<Data> list = (ObservableList<Data>)observable;
				for(Data d:list){
					System.out.println("		"+d);
				}
			}
		});


		//设置table为可编辑状态
		tableView.setEditable(true);
		//给每一列设置编辑
		tc_name.setCellFactory(TextFieldTableCell.forTableColumn());
		//注意：这里age为Int类型，需要转换
		tc_age.setCellFactory(TextFieldTableCell.forTableColumn(new StringConverter<Number>() {
			@Override
			public String toString(Number object) {
				return object.toString();
			}
			@Override
			public Number fromString(String string) {
				//暂不捕获异常
				return Integer.parseInt(string);
			}
		}));

		/*tableView.getSelectionModel().getSelectedCells().addListener(new InvalidationListener() {
			@Override
			public void invalidated(Observable observable) {
				System.out.println("获取单元格的信息：");
				ObservableList<TablePosition>   obs = (ObservableList<TablePosition>)observable;
				for(TablePosition p:obs){
					System.out.println("      行号："+p.getRow() + "     列号："+p.getColumn()  + "   值："+p.getTableColumn().getCellData(p.getRow()));
				}

			}
		});*/

		b1.setOnAction(new EventHandler<ActionEvent>() {

			@Override
			public void handle(ActionEvent event) {
				//新增
				//tableView.getItems().add(new Data("A", 19, 55.9, true));

				//删除
				//tableView.getItems().remove(0);

				//如果直接使用对象，则需要刷新
				//d1.setName("李逵");
				//tableView.refresh();

				//选择第四行
				//tableView.getSelectionModel().select(3);

				//选择第四行， tc_name这列
				tableView.getSelectionModel().select(3, tc_name);

				//选择最后一行
				//tableView.getSelectionModel().selectLast();

				//选择左边，如果为多行选择模式，则同时选择左边
				//tableView.getSelectionModel().selectLeftCell();

				//设置第四行，第0列被选中
				tableView.getFocusModel().focus(4);

				//tableView.requestFocus();

				//tableView.sort();

				//没用
				//tc_age.setSortType(SortType.DESCENDING);

				tc_age.setComparator(new Comparator<Number>() {
					@Override
					public int compare(Number o1, Number o2) {
						return o2.intValue() - o1.intValue();
					}
				});

			}
		});

	}
}
